#include "autodue.h"

//Questa funzione esegue il parsing del documento xml passato come parametro
xmlDocPtr getdoc(char *docname)
{
	xmlDocPtr doc;
	doc = xmlParseFile(docname);

	if (doc == NULL )
	{
		fprintf(stderr,"Document not parsed successfully.\n");
		return NULL;
	}

	return doc;
}

// Questa funzione restituisce un puntatore al set di nodi presenti nel documento doc
// e corrispondenti all' xpath passato come parametro
xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath)
{
	xmlXPathContextPtr context;
	xmlXPathObjectPtr result;

	context = xmlXPathNewContext(doc);
	if (context == NULL)
	{
		printf("Error in xmlXPathNewContext\n");
		return NULL;
	}
	result = xmlXPathEvalExpression(xpath, context);
	xmlXPathFreeContext(context);
	if (result == NULL)
	{
		printf("Error in xmlXPathEvalExpression\n");
		return NULL;
	}
	if(xmlXPathNodeSetIsEmpty(result->nodesetval))
	{
		xmlXPathFreeObject(result);
        //printf("%s: No result\n", xpath);
		return NULL;
	}
	return result;
}

// Questa funzione restituisce una stringa corrispondente al contenuto della prima occorrenza
// della tag specificata dall'xpath passato come parametro e presente nel documento doc_xml
xmlChar* getfirstvalue(xmlDocPtr doc_xml, xmlChar* xpath)
{
	return getonevalue(doc_xml, xpath, 0);
}

// Questa funzione restituisce una stringa corrispondente al contenuto della i-esima occorrenza
// della tag specificata dall'xpath passato come parametro e presente nel documento doc_xml
xmlChar* getonevalue(xmlDocPtr doc_xml, xmlChar* xpath, int occurrence)
{
	xmlNodeSetPtr nodeset;
	xmlXPathObjectPtr result;
	result = getnodeset (doc_xml, xpath);
	if (result)
		nodeset = result->nodesetval;
	else
		return NULL;
	xmlChar* return_string = xmlNodeListGetString(doc_xml, nodeset->nodeTab[occurrence]->xmlChildrenNode, 1);
	//printf("%s: %s", xpath, ((char *)return_string)?(char *)return_string:"");

	xmlXPathFreeObject (result);

	return return_string;

}

// Questa funzione restituisce il numero di occorenze della tag specificata dall'xpath
// nel documento doc_xml
int tagcount(xmlDocPtr doc_xml, xmlChar *xpath)
{
	int count = 0;
	xmlXPathObjectPtr result;
	result = getnodeset (doc_xml, xpath);
	if (result)
	{
		count = result->nodesetval->nodeNr;
		xmlXPathFreeObject (result);
	}
	return count;
}

// Funzione utilizzata per eseguire la funzione qsort()
int compare(const void *a, const void *b)
{
	return (*(int *)a - *(int *)b);
}

